import CryptoJS from 'crypto-js';
import store from '@/store/index';
import { encodeRSA } from '@/utils/encryption/rsaUtil.js';
import { AES_KEY } from './index';

// 使用rsa解密 加密的后的aes的秘钥
// const aeskey = CryptoJS.enc.Utf8.parse(store.getters.sysAesKey);
export default {
    // 加密为 Base64格式的数据 转化成字符串返回
    encryptAESBase64ToString(data, type = 'CBC') {
        if (typeof data == 'object') {
            data = JSON.stringify(data);
        }
        let encrypted = '';
        switch (type) {
            case 'ECB':
                encrypted = this.encrypt_AES_ECB(data);
                break;
            case 'CBC':
                encrypted = this.encrypt_AES_CBC(data);
                break;
            default:
                encrypted = this.encrypt_AES_ECB(data);
                break;
        }
        return CryptoJS.enc.Base64.stringify(encrypted.ciphertext).trim();
    },
    // 解密 Base64格式的数据 转化成字符串返回
    decryptBase64ToString(data, type = 'CBC') {
        if (typeof data == 'object') {
            data = JSON.stringify(data);
        }
        let decrypted = '';
        switch (type) {
            case 'ECB':
                decrypted = this.decrypt_AES_ECB(data);
                break;
            case 'CBC':
                decrypted = this.decrypt_AES_CBC(data);
                break;
            default:
                decrypted = this.decrypt_AES_ECB(data);
                break;
        }
        return decrypted.toString(CryptoJS.enc.Utf8).trim();
    },

    // 加密：ECB 模式
    encrypt_AES_ECB(data) {
        let aesKey = CryptoJS.enc.Utf8.parse(AES_KEY);
        // 将加密的内容转换成UTF-8编码格式
        data = CryptoJS.enc.Utf8.parse(data);
        // console.log('生成AES秘钥：', aesKey.toString(CryptoJS.enc.Utf8));
        store.commit('setAesKey', encodeRSA(aesKey.toString(CryptoJS.enc.Utf8)));
        const encrypted = CryptoJS.AES.encrypt(data, aesKey, {
            mode: CryptoJS.mode.ECB, // AES加密模式
            padding: CryptoJS.pad.Pkcs7, // 填充方式
        });
        return encrypted;
    },
    // 解密：ECB 模式
    decrypt_AES_ECB(data) {
        try {
            let aesKey = CryptoJS.enc.Utf8.parse(AES_KEY);
            // console.log('解密时的秘钥：', aesKey.toString(CryptoJS.enc.Utf8));
            return CryptoJS.AES.decrypt(data, aesKey, {
                mode: CryptoJS.mode.ECB, // AES加密模式
                padding: CryptoJS.pad.Pkcs7, // 填充方式
            }).toString(CryptoJS.enc.Utf8);
        } catch (e) {
            console.error('AES解密失败，原因：' + e);
        }
    },

    //============================================================================================================

    // 加密：CBC 模式
    encrypt_AES_CBC(data) {
        let aesKey = CryptoJS.enc.Utf8.parse(AES_KEY);
        // 将加密的内容转换成UTF-8编码格式
        data = CryptoJS.enc.Utf8.parse(data);
        // console.log('生成AES秘钥：', aesKey.toString(CryptoJS.enc.Utf8));
        store.commit('setAesKey', encodeRSA(aesKey.toString(CryptoJS.enc.Utf8)));
        return CryptoJS.AES.encrypt(data, aesKey, {
            iv: aesKey, // 偏移量默认为密钥
            mode: CryptoJS.mode.CBC, // AES加密模式
            padding: CryptoJS.pad.Pkcs7, // 填充方式
        });
    },
    // 解密：CBC 模式
    decrypt_AES_CBC(data) {
        try {
            let aesKey = CryptoJS.enc.Utf8.parse(AES_KEY);
            // console.log('解密时的秘钥：', aesKey.toString(CryptoJS.enc.Utf8));
            return CryptoJS.AES.decrypt(data, aesKey, {
                iv: aesKey,
                mode: CryptoJS.mode.CBC, // AES加密模式
                padding: CryptoJS.pad.Pkcs7, // 填充方式
            }).toString(CryptoJS.enc.Utf8);
        } catch (e) {
            console.error('AES解密失败，原因：' + e);
        }
    },
};